package com.goldmantis.alitrip.common;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.taobao.api.*;
import jdk.nashorn.internal.objects.annotations.Getter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.entity.Example;

import java.util.Date;
import java.util.List;

/**
 * @Author:Shmily
 * @Description: 通用服务类，注意此类一定要是抽象类。
 * @Date:Create in 12:41 2018/1/25
 */
public abstract class BaseService<T> {

    /**
     * Spring 4.0 提供的新特性，泛型注入
     */
    @Autowired
    private Mapper<T> mapper;


    /**
     * 保存一个实体，null的属性也会保存，不会使用数据库默认值
     * @param t
     * @return
     */
    public T insert(T t){
        int insert = this.mapper.insert(t);
        return t;
    }

    /**
     * 保存一个实体，null的属性不会保存，会使用数据库默认值
     * @param t
     * @return
     */
    public T insertSelective(T t){
        this.mapper.insertSelective(t);
        return t;
    }



    /**
     * 根据主键更新实体全部字段，null值会被更新
     * @param t
     * @return
     */
    public T update(T t){
        this.mapper.updateByPrimaryKey(t);
        return t;
    }

    /**
     * 根据主键更新属性不为null的值
     * @param t
     * @return
     */
    public T updateByPrimaryKeySelective(T t){
        this.mapper.updateByPrimaryKeySelective(t);
        return t;
    }



    /**
     * 根据主键删除
     * @param id
     * @return
     */
    public Integer deleteById(long id){
        return this.mapper.deleteByPrimaryKey(id);
    }

    /**
     * 根据条件删除
     * @param t
     * @return
     */
    public Integer delete(T t){
        return this.mapper.delete(t);
    }

    /**
     * 批量删除数据
     * @param ids
     * @param clazz
     * @param idProperty
     * @return
     */
    public Integer deleteByIds(List<Object> ids,Class<T> clazz,String idProperty){
        Example example=new Example(clazz);
        example.createCriteria().andIn(idProperty,ids);
        return this.mapper.deleteByExample(example);
    }

    /**
     * 根据id查询数据
     * @param id
     * @return
     */
    public T selectById(Long id){
        return this.mapper.selectByPrimaryKey(id);
    }

    /**
     * 获取全部数据
     * @return
     */
    public List<T> selectAll(){
        return this.mapper.select(null);
    }

    /**
     * 查询一条数据，如果查出多条，则抛异常
     * @param t
     * @return
     */
    public T selectOne(T t){
        return this.mapper.selectOne(t);
    }

    /**
     * 根据条件查出多条数据
     * @param t
     * @return
     */
    public List<T> select(T t){
        return this.mapper.select(t);
    }

    /**
     * 根据条件查出多条数据
     * @param t
     * @param offset
     * @param limit
     * @return
     */
    public PageInfo<T> pageList(T t, Integer offset, Integer limit){
        PageHelper.startPage(offset,limit);
        List<T> list = this.mapper.select(t);
        return new PageInfo<T>(list);
    }


}
